import { AIAgentResponseHandler, EnhancedAgentMCPBridge, demonstrateResponseHandling } from './ai-response-handling';

async function demonstrateResponseFormats() {
  console.log('🤖 AI模型响应格式处理演示');
  console.log('='.repeat(60));
  
  const handler = new AIAgentResponseHandler();
  
  // 演示1：结构化响应
  console.log('\n📋 1. 结构化响应处理 (OpenAI格式)');
  console.log('-'.repeat(40));
  
  const structuredResponse = {
    choices: [{
      message: {
        role: 'assistant',
        content: '我来帮您查询北京的天气信息。',
        tool_calls: [
          {
            id: 'call_abc123',
            type: 'function',
            function: {
              name: 'get_weather',
              arguments: JSON.stringify({ location: 'Beijing', temperature_unit: 'celsius' })
            }
          }
        ]
      }
    }]
  };
  
  const structuredResult = handler.handleStructuredResponse(structuredResponse);
  console.log('原始响应:', JSON.stringify(structuredResponse, null, 2));
  console.log('处理后:', structuredResult);
  
  // 演示2：半结构化响应
  console.log('\n📋 2. 半结构化响应处理 (JSON in text)');
  console.log('-'.repeat(40));
  
  const semiStructuredResponse = {
    choices: [{
      message: {
        role: 'assistant',
        content: `我来帮您分析天气数据。

\`\`\`json
{
  "tool": "calculate",
  "arguments": {
    "expression": "25 * 9/5 + 32"
  }
}
\`\`\`

这个计算将把摄氏温度转换为华氏温度。`
      }
    }]
  };
  
  const semiStructuredResult = handler.handleSemiStructuredResponse(semiStructuredResponse);
  console.log('原始响应:', JSON.stringify(semiStructuredResponse, null, 2));
  console.log('处理后:', semiStructuredResult);
  
  // 演示3：纯文本响应
  console.log('\n📋 3. 纯文本响应处理 (自然语言)');
  console.log('-'.repeat(40));
  
  const textOnlyResponse = {
    choices: [{
      message: {
        role: 'assistant',
        content: '我需要调用 get_weather 工具来获取北京的天气信息，参数是 location: Beijing。然后我可能还需要使用 calculate 工具来进行温度转换。'
      }
    }]
  };
  
  const textOnlyResult = handler.handleTextOnlyResponse(textOnlyResponse);
  console.log('原始响应:', JSON.stringify(textOnlyResponse, null, 2));
  console.log('处理后:', textOnlyResult);
  
  // 演示4：复杂的多工具调用
  console.log('\n📋 4. 复杂多工具调用解析');
  console.log('-'.repeat(40));
  
  const complexResponse = {
    choices: [{
      message: {
        role: 'assistant',
        content: `为了完成您的请求，我需要执行以下操作：

1. 首先调用 get_weather with location: Beijing
2. 然后使用 calculate with expression: 25 * 9/5 + 32
3. 最后调用 search with query: "北京旅游攻略"

\`\`\`json
{
  "tool": "get_weather",
  "arguments": {
    "location": "Beijing"
  }
}
\`\`\``
      }
    }]
  };
  
  const complexResult = handler.handleSemiStructuredResponse(complexResponse);
  console.log('原始响应:', JSON.stringify(complexResponse, null, 2));
  console.log('处理后:', complexResult);
  
  // 演示5：解析失败的情况
  console.log('\n📋 5. 解析失败的处理');
  console.log('-'.repeat(40));
  
  const invalidResponse = {
    choices: [{
      message: {
        role: 'assistant',
        content: '我理解您的需求，但我需要更多信息才能帮助您。'
      }
    }]
  };
  
  const invalidResult = handler.handleSemiStructuredResponse(invalidResponse);
  console.log('原始响应:', JSON.stringify(invalidResponse, null, 2));
  console.log('处理后:', invalidResult);
  console.log('是否有工具调用:', invalidResult.tool_calls ? '是' : '否');
}

// 实际应用示例
async function realWorldExample() {
  console.log('\n🌍 真实世界应用示例');
  console.log('='.repeat(60));
  
  const agent = new EnhancedAgentMCPBridge({
    name: 'ResponseHandlerDemo',
    description: 'Demonstrates response handling',
    systemPrompt: 'You are a helpful assistant.',
    mcpClients: []
  });
  
  try {
    // 模拟不同AI模型的响应
    const testMessages = [
      '帮我查询北京天气',
      '计算 25 * 4 的结果',
      '分析一下当前的市场趋势'
    ];
    
    for (const message of testMessages) {
      console.log(`\n📝 用户消息: ${message}`);
      console.log('-'.repeat(30));
      
      const response = await agent.callLLM([{ role: 'user', content: message }], [
        {
          type: 'function',
          function: {
            name: 'get_weather',
            description: 'Get weather information',
            parameters: { type: 'object', properties: { location: { type: 'string' } } }
          }
        }
      ]);
      
      console.log('AI响应:', response);
      
      if (response.tool_calls) {
        console.log('✅ 检测到工具调用:');
        response.tool_calls.forEach((call: any, index: number) => {
          console.log(`   ${index + 1}. ${call.function.name}(${call.function.arguments})`);
        });
      } else {
        console.log('ℹ️ 无工具调用，纯文本响应');
      }
      
      await new Promise(resolve => setTimeout(resolve, 1000));
    }
    
  } catch (error) {
    console.error('演示失败:', error);
  }
}

// 错误处理和最佳实践
function errorHandlingBestPractices() {
  console.log('\n🛡️ 错误处理和最佳实践');
  console.log('='.repeat(60));
  
  console.log(`
📋 响应处理的最佳实践:

1. **多级Fallback机制**
   ├─ 优先使用结构化解析
   ├─ 失败时尝试半结构化解析
   ├─ 最后使用NLP文本解析
   └─ 都失败时要求用户澄清

2. **验证和清理**
   ├─ 验证工具名称是否存在
   ├─ 验证参数格式是否正确
   ├─ 清理和转义特殊字符
   └─ 设置参数默认值

3. **错误恢复**
   ├─ 记录解析失败的原因
   ├─ 提供有意义的错误信息
   ├─ 尝试自动修复常见问题
   └─ 必要时请求人工干预

4. **性能考虑**
   ├─ 缓存常用的解析模式
   ├─ 限制解析时间复杂度
   ├─ 使用预编译的正则表达式
   └─ 避免深度递归解析

5. **安全性**
   ├─ 验证JSON字符串安全性
   ├─ 防止注入攻击
   ├─ 限制参数大小和复杂度
   └─ 记录所有工具调用
`);
}

export { demonstrateResponseFormats, realWorldExample, errorHandlingBestPractices };

if (require.main === module) {
  demonstrateResponseHandling();
  demonstrateResponseFormats().then(() => {
    return realWorldExample();
  }).then(() => {
    errorHandlingBestPractices();
  }).catch(console.error);
}